package com.projekt.alpar;

import HatterOsztalyok.Database;
import android.app.AlertDialog;
import android.app.ExpandableListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.ExpandableListView.OnChildClickListener;

public class ArtistsActivity extends ExpandableListActivity implements
		OnChildClickListener {
	private MyExpandableListAdapter mAdapter;
	private Intent intent;
	private String selectedSong;

	/**
	 * Létrehozza az activity-t
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.i("ArtistsActivity", "superoncreate elott");
		super.onCreate(savedInstanceState);
		Log.i("ArtistsActivity", "superoncreate utan");

		mAdapter = new MyExpandableListAdapter();
		setListAdapter(mAdapter);
		intent = new Intent("com.projekt.alpar.commandevent");
		registerForContextMenu(getExpandableListView());
	}

	/**
	 * Ha a felhasználó kiválaszt egy elemet a listából ez a metódus hívodik
	 * meg. Jelzi a PlayerService-nek, hogy ezt a zenét játssza le
	 */
	public boolean onChildClick(ExpandableListView parent, View v,
			int groupPosition, int childPosition, long id) {
		Log.i("Artistactivity", "onchildclick meghivva");
		intent.putExtra("source", 1);
		intent.putExtra("count", childPosition);
		intent.putExtra("filter", mAdapter.getGroupName(groupPosition));
		sendBroadcast(intent);
		return true;
	}

	/**
	 * Létrehozza a ContextMenu-t, ha a felhasználó hosszan nyomva tartva
	 * kiválaszt egy elemet. A ContextMenu-ben hozzáadhatja a kiválasztott
	 * számot valamelyik Playlisthez
	 */
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);

		ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuInfo;
		TextView pr = (TextView) info.targetView;
		selectedSong = pr.getText().toString();

		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.playlistcontextmenu, menu);
		Log.i("AlbumsActivity", "menuinflater utan");

		Database adat = new Database(getApplicationContext(),
				getContentResolver(), 1);
		SQLiteDatabase db = adat.getReadableDatabase();

		String oszlopok[] = { "name" };
		Cursor lekerd = db.query("Playlist", oszlopok, null, null, null, null,
				null);
		if (lekerd == null)
			Log.e("MyExpandableListAdapter", "lekerdezes==null");
		else {
			if (!lekerd.moveToFirst())
				Log.e("MyExpandableListAdapter", "no query result");
			else
				do {
					menu.add(lekerd.getString(lekerd.getColumnIndex("name")));
				} while (lekerd.moveToNext());
			lekerd.close();
			db.close();
		}
	}

	/**
	 * Ha kiválasztotta a felhasználó, hogy melyik Playlisthez(vagy egy újhoz)
	 * szeretné hozzáadni a számot, akkor elvégzi a szükséges adatbázis
	 * módosításokat
	 */
	public boolean onContextItemSelected(MenuItem item) {
		if (item.getItemId() == R.id.addplaylist) {
			AlertDialog.Builder alert = new AlertDialog.Builder(this);

			alert.setTitle(R.string.newPlaylistTitle);

			final EditText input = new EditText(this);
			alert.setView(input);

			alert.setPositiveButton("Ok",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog,
								int whichButton) {
							Database db = new Database(getApplicationContext(),
									getContentResolver(), 1);
							db.addPlaylist(input.getText().toString());
							int mid2 = db.getSong(selectedSong);
							int pid2 = db.getPlaylist(input.getText()
									.toString());
							db.insertToConn(mid2, pid2);
						}
					});

			alert.setNegativeButton(R.string.cancel,
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog,
								int whichButton) { // Canceled.
						}
					});

			alert.show();
		} else {
			int mid = 0, pid = 0;
			Database adat = new Database(getApplicationContext(),
					getContentResolver(), 1);
			mid = adat.getSong(selectedSong);
			pid = adat.getPlaylist(item.getTitle().toString());
			Log.i("Selected playlist", item.getTitle().toString());
			adat.insertToConn(mid, pid);
		}
		return true;
	}

	/**
	 * Adapter osztály, amely az adatokat szolgáltatja az Activity-nek *
	 */
	private class MyExpandableListAdapter extends BaseExpandableListAdapter {
		private String[] groups;
		private String[][] childs;
		private int loaded[];
		private int groupLength;

		/**
		 * Konstruktor, amely lekérdezi az adatokat az adatbázistól
		 */
		public MyExpandableListAdapter() {
			Log.i("MyExpandableListAdapter", "konstruktor meghivva");

			Database adat = new Database(getApplicationContext(),
					getContentResolver(), 1);
			SQLiteDatabase db = adat.getReadableDatabase();

			String oszlopok[] = { "distinct artist" };
			Cursor lekerd = db.query("Music", oszlopok, null, null, null, null,
					null);
			if (lekerd == null)
				Log.e("MyExpandableListAdapter", "lekerdezes==null");
			else if (!lekerd.moveToFirst())
				Log.e("MyExpandableListAdapter", "no query result");
			else {
				groupLength = 0;
				groups = new String[lekerd.getCount()];
				loaded = new int[lekerd.getCount()];
				childs = new String[lekerd.getCount()][];
				Log.i("MyExpandableListAdapter", "lekerdezes OK");
				do {
					groups[groupLength] = lekerd.getString(lekerd
							.getColumnIndex("artist"));
					Log.i("MyExpandableListAdapter", "lekerdezes="
							+ groups[groupLength]);
					loaded[groupLength++] = 0;
				} while (lekerd.moveToNext());
			}
			Log.i("MyExpandableListAdapter", "lekerdezes OK");
			adat.close();
		}

		/**
		 * Visszatéríti az egyes belső elemeket
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public Object getChild(int groupPosition, int childPosition) {
			Log.i("MyExpandableListAdapter",
					"getChild meghivva " + Integer.toString(groupPosition)
							+ " " + Integer.toString(childPosition));
			return childs[groupPosition][childPosition];
		}

		/**
		 * Visszatéríti a belső elem id-ját, amely megegyezik a csoportban
		 * elfoglalt pozíciójával
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public long getChildId(int groupPosition, int childPosition) {
			return childPosition;
		}

		/**
		 * Visszatéríti, hogy a csoportban hány elem van
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba id-ja
		 */
		public int getChildrenCount(int groupPosition) {
			Log.i("MyExpandableListAdapter", "getChildrenCount meghivva "
					+ Integer.toString(groupPosition));
			if (loaded[groupPosition] == 0)
				loadGroup(groupPosition);
			return loaded[groupPosition];
		}

		/**
		 * Visszatéríti az általános View-t egy elemnek
		 */
		public TextView getGenericView() {
			AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
					ViewGroup.LayoutParams.MATCH_PARENT, 64);

			TextView textView = new TextView(ArtistsActivity.this);
			textView.setLayoutParams(lp);
			textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
			textView.setPadding(36, 0, 0, 0);
			return textView;
		}

		/**
		 * Visszatéríti a view-t egy adott elemről, ami egy TextView-ből áll
		 * 
		 * @param groupPosition
		 *            Hányadik csoportba tartozik az elem
		 * @param childPosition
		 *            Hányadik a csoportban
		 */
		public View getChildView(int groupPosition, int childPosition,
				boolean isLastChild, View convertView, ViewGroup parent) {
			TextView textView = getGenericView();
			textView.setText(getChild(groupPosition, childPosition).toString());
			return textView;
		}

		/**
		 * Visszatéríti egy adott csoport információit(ebben az esetben a nevét)
		 */
		public Object getGroup(int groupPosition) {
			return groups[groupPosition];
		}

		/**
		 * Visszatéríti a csoportok számát
		 */
		public int getGroupCount() {
			return groupLength;
		}

		/**
		 * Visszatéríti a csoport id-ját, ami ebben az esetben megegyezik a
		 * pozíciójával
		 */
		public long getGroupId(int groupPosition) {
			return groupPosition;
		}

		/**
		 * Visszatéríti a view-t egy csoporthoz
		 */
		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent) {
			TextView textView = getGenericView();
			textView.setText(getGroup(groupPosition).toString());
			return textView;
		}

		/**
		 * Visszatéríti, hogy az illető belső elem választható-e
		 */
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			return true;
		}

		/**
		 * Visszatéríti, hogy az id-k stabilak-e az adatok változása esetén
		 */
		public boolean hasStableIds() {
			return true;
		}

		/**
		 * Ha egy olyan csoport volt kiválasztva, ami még nincs betöltve az
		 * adatbázisból, akkor betölti
		 * 
		 * @param groupPosition
		 *            Hányadik csoport
		 */
		private void loadGroup(int groupPosition) {
			Log.i("MyExpandableListAdapter",
					"loadgroup meghivva " + Integer.toString(groupPosition));

			Database adat = new Database(getApplicationContext(),
					getContentResolver(), 1);
			SQLiteDatabase db = adat.getReadableDatabase();

			String oszlopok[] = { "title" };
			Cursor lekerd = db.query("Music", oszlopok, "artist='"
					+ groups[groupPosition] + "'", null, null, null, null);
			if (lekerd == null)
				Log.e("MyExpandableListAdapter", "Grouplekerdezes==null");
			else if (!lekerd.moveToFirst())
				Log.e("MyExpandableListAdapter", "Group: no query result");
			else {
				loaded[groupPosition] = lekerd.getCount();
				childs[groupPosition] = new String[loaded[groupPosition]];
				int k = 0;
				do {
					childs[groupPosition][k++] = lekerd.getString(lekerd
							.getColumnIndex("title"));
				} while (lekerd.moveToNext());
			}
			adat.close();
		}

		/**
		 * Visszatéríti a csoport nevét
		 * 
		 * @param groupPosition
		 *            Hányadik csoport
		 */
		public String getGroupName(int groupPosition) {
			return groups[groupPosition];
		}
	}
}
